package com.helin.helinhealth.controller;

import com.helin.helinhealth.common.Result;
import com.helin.helinhealth.dto.AiQuestionDTO;
import com.helin.helinhealth.entity.AiQa;
import com.helin.helinhealth.mapper.AiQaMapper;
import com.helin.helinhealth.service.AiService;
import com.helin.helinhealth.dto.AiQuestionLearningRecord;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI问答控制器
 * 
 * <p>
 * 该控制器处理与AI智能问答相关的HTTP请求，
 * 提供健康咨询、问题解答等功能。
 * </p>
 */
@Slf4j
@Tag(name = "AI问答", description = "AI智能问答接口")
@RestController
@RequestMapping("/api/ai")
public class AiController {

    @Autowired
    private AiService aiService;
    
    @Autowired
    private AiQaMapper aiQaMapper;

    /**
     * 提交问题并获取AI回答
     * 
     * <p>
     * 接收用户提交的健康相关问题，先从知识库中查找答案，
     * 如未找到则调用阿里通义千问API获取回答。
     * </p>
     * 
     * @param questionDTO 问题请求对象
     * @return AI回答结果
     */
    @Operation(summary = "提交问题", description = "向AI提交健康相关问题")
    @PostMapping("/ask")
    public Result askQuestion(@RequestBody AiQuestionDTO questionDTO) {
        try {
            if (questionDTO == null || questionDTO.getQuestion() == null || questionDTO.getQuestion().trim().isEmpty()) {
                return Result.error("问题不能为空");
            }
            
            // 记录用户原始问题，去除首尾空格
            String userQuestion = questionDTO.getQuestion().trim();
            log.info("接收到AI问答请求: {}", userQuestion);
            
            // 检查问题长度
            if (userQuestion.length() > 200) {
                return Result.error("问题过长，请简化您的问题");
            }
            
            // 调用AI服务获取回答
            String answer = aiService.askQuestion(userQuestion);
            
            // 记录热门问题，如果这是一个新问题且来自AI而非知识库
            if (aiService.queryFromKnowledgeBase(userQuestion) == null) {
                // 记录这个问题和回答，在未来可能添加到知识库
                recordNewQuestion(userQuestion, answer);
            }
            
            return Result.success("问题回答成功", answer);
        } catch (Exception e) {
            log.error("AI问答处理出错", e);
            return Result.error("处理问题时出错: " + e.getMessage());
        }
    }
    
    /**
     * 记录新的问题和回答
     * 
     * @param question 用户问题
     * @param answer AI回答
     */
    private void recordNewQuestion(String question, String answer) {
        try {
            // 创建AI问答学习记录
            String processedQuestion = question; // 实际应用中这里应该是预处理后的问题
            AiQuestionLearningRecord learningRecord = AiQuestionLearningRecord.create(
                question,           // 原始问题
                processedQuestion,  // 处理后的问题
                answer,             // AI回答
                2                   // 来源:2-AI接口
            );
            
            // 这里可以将记录保存到数据库或日志系统
            // 示例：learningService.saveLearningRecord(learningRecord);
            
            // 当前简单记录到日志
            log.info("记录新问题学习数据: {}", learningRecord);
        } catch (Exception e) {
            log.error("记录新问题失败", e);
        }
    }
    
    /**
     * 获取热门问题列表
     * 
     * @return 热门问题及答案列表
     */
    @Operation(summary = "获取热门问题", description = "获取系统中的热门健康问题及答案")
    @GetMapping("/hot-questions")
    public Result getHotQuestions(@RequestParam(required = false, defaultValue = "10") Integer limit) {
        try {
            // 安全检查
            if (limit < 1 || limit > 50) {
                limit = 10; // 默认限制为10条
            }
            
            // 获取热门问题（按照命中次数排序）
            List<AiQa> hotQuestions = aiQaMapper.selectHotQuestions(limit);
            
            // 构建优化的响应数据结构，只包含必要字段
            List<Map<String, Object>> items = new ArrayList<>();
            for (AiQa qa : hotQuestions) {
                Map<String, Object> item = new HashMap<>();
                item.put("id", qa.getId());
                item.put("question", qa.getQuestion());
                item.put("answer", qa.getAnswer());
                // 可以省略hit_count等非必要字段
                items.add(item);
            }
            
            // 构建响应数据
            Map<String, Object> responseData = new HashMap<>();
            responseData.put("total", items.size());
            responseData.put("items", items);
            
            return Result.success("获取热门问题成功", responseData);
        } catch (Exception e) {
            log.error("获取热门问题出错", e);
            return Result.error("获取热门问题失败: " + e.getMessage());
        }
    }
} 